1#[cfg(unix)]
2mod_use![unix];
3
4#[cfg(io_uring)]
5mod_use![iour];
6
7#[cfg(windows)]
8mod_use![iocp];
9
10#[cfg(polling)]
11mod_use![poll];
12
13#[cfg(stub)]
14mod_use![stub];
15
16use compio_buf::IoBufExt;
17use rustix::net::{RecvFlags, ReturnFlags, SendFlags};
18
19use crate::{PollFirst, sys::prelude::*};
20
21pub struct Connect<S> {
23 pub(crate) fd: S,
24 pub(crate) addr: SockAddr,
25}
26
27pub struct CloseSocket {
29 pub(crate) fd: ManuallyDrop<OwnedFd>,
30}
31
32pub struct Send<T: IoBuf, S> {
38 pub(crate) fd: S,
39 pub(crate) buffer: T,
40 pub(crate) flags: SendFlags,
41}
42
43pub struct SendVectored<T: IoVectoredBuf, S> {
45 pub(crate) fd: S,
46 pub(crate) buffer: T,
47 pub(crate) flags: SendFlags,
48}
49
50pub(crate) struct SendToHeader<S> {
51 pub(crate) fd: S,
52 pub(crate) addr: SockAddr,
53 pub(crate) flags: SendFlags,
54}
55
56pub struct SendTo<T: IoBuf, S> {
58 pub(crate) header: SendToHeader<S>,
59 pub(crate) buffer: T,
60}
61
62pub struct SendToVectored<T: IoVectoredBuf, S> {
64 pub(crate) header: SendToHeader<S>,
65 pub(crate) buffer: T,
66}
67
68pub struct SendMsg<T: IoVectoredBuf, C: IoBuf, S> {
71 pub(crate) fd: S,
72 pub(crate) buffer: T,
73 pub(crate) control: C,
74 pub(crate) addr: Option<SockAddr>,
75 pub(crate) flags: SendFlags,
76}
77
78pub struct Recv<T: IoBufMut, S> {
84 pub(crate) fd: S,
85 pub(crate) buffer: T,
86 pub(crate) flags: RecvFlags,
87 poll_first: bool,
88}
89
90pub struct RecvVectored<T: IoVectoredBufMut, S> {
92 pub(crate) fd: S,
93 pub(crate) buffer: T,
94 pub(crate) flags: RecvFlags,
95 poll_first: bool,
96}
97
98pub(crate) struct RecvFromHeader<S> {
99 pub(crate) fd: S,
100 pub(crate) flags: RecvFlags,
101 pub(crate) addr: SockAddrStorage,
102 pub(crate) addr_len: socklen_t,
103 poll_first: bool,
104}
105
106pub struct RecvFrom<T: IoBufMut, S> {
108 pub(crate) header: RecvFromHeader<S>,
109 pub(crate) buffer: T,
110}
111
112pub struct RecvFromVectored<T: IoVectoredBufMut, S> {
114 pub(crate) header: RecvFromHeader<S>,
115 pub(crate) buffer: T,
116}
117
118pub struct RecvMsg<T: IoVectoredBufMut, C: IoBufMut, S> {
121 pub(crate) header: RecvFromHeader<S>,
122 pub(crate) buffer: T,
123 pub(crate) control: C,
124 pub(crate) control_len: usize,
125 pub(crate) return_flags: ReturnFlags,
126 poll_first: bool,
127}
128
129impl<S> Connect<S> {
130 pub fn new(fd: S, addr: SockAddr) -> Self {
132 Self { fd, addr }
133 }
134}
135
136impl CloseSocket {
137 pub fn new(fd: OwnedFd) -> Self {
139 Self {
140 fd: ManuallyDrop::new(fd),
141 }
142 }
143}
144
145impl<T: IoBuf, S> Send<T, S> {
146 pub fn new(fd: S, buffer: T, flags: SendFlags) -> Self {
148 Self { fd, buffer, flags }
149 }
150}
151
152impl<T: IoBuf, S> IntoInner for Send<T, S> {
153 type Inner = T;
154
155 fn into_inner(self) -> Self::Inner {
156 self.buffer
157 }
158}
159
160impl<T: IoVectoredBuf, S> SendVectored<T, S> {
161 pub fn new(fd: S, buffer: T, flags: SendFlags) -> Self {
163 Self { fd, buffer, flags }
164 }
165}
166
167impl<T: IoVectoredBuf, S> IntoInner for SendVectored<T, S> {
168 type Inner = T;
169
170 fn into_inner(self) -> Self::Inner {
171 self.buffer
172 }
173}
174
175impl<S> SendToHeader<S> {
176 pub fn new(fd: S, addr: SockAddr, flags: SendFlags) -> Self {
177 Self { fd, addr, flags }
178 }
179}
180
181impl<T: IoBuf, S> SendTo<T, S> {
182 pub fn new(fd: S, buffer: T, addr: SockAddr, flags: SendFlags) -> Self {
184 Self {
185 header: SendToHeader::new(fd, addr, flags),
186 buffer,
187 }
188 }
189}
190
191impl<T: IoBuf, S> IntoInner for SendTo<T, S> {
192 type Inner = T;
193
194 fn into_inner(self) -> Self::Inner {
195 self.buffer
196 }
197}
198
199impl<T: IoVectoredBuf, S> SendToVectored<T, S> {
200 pub fn new(fd: S, buffer: T, addr: SockAddr, flags: SendFlags) -> Self {
202 Self {
203 header: SendToHeader::new(fd, addr, flags),
204 buffer,
205 }
206 }
207}
208
209impl<T: IoVectoredBuf, S> IntoInner for SendToVectored<T, S> {
210 type Inner = T;
211
212 fn into_inner(self) -> Self::Inner {
213 self.buffer
214 }
215}
216
217impl<T: IoVectoredBuf, C: IoBuf, S> SendMsg<T, C, S> {
218 pub fn new(fd: S, buffer: T, control: C, addr: Option<SockAddr>, flags: SendFlags) -> Self {
224 assert!(
225 control.buf_len() == 0 || control.buf_ptr().cast::<CmsgHeader>().is_aligned(),
226 "misaligned control message buffer"
227 );
228 Self {
229 fd,
230 buffer,
231 control,
232 addr,
233 flags,
234 }
235 }
236}
237
238impl<T: IoVectoredBuf, C: IoBuf, S> IntoInner for SendMsg<T, C, S> {
239 type Inner = (T, C);
240
241 fn into_inner(self) -> Self::Inner {
242 (self.buffer, self.control)
243 }
244}
245
246impl<T: IoVectoredBufMut, C: IoBufMut, S> RecvMsg<T, C, S> {
247 pub fn new(fd: S, buffer: T, control: C, flags: RecvFlags) -> Self {
254 assert!(
255 control.buf_ptr().cast::<CmsgHeader>().is_aligned(),
256 "misaligned control message buffer"
257 );
258 Self {
259 header: RecvFromHeader::new(fd, flags),
260 buffer,
261 control,
262 control_len: 0,
263 return_flags: ReturnFlags::empty(),
264 poll_first: false,
265 }
266 }
267}
268
269impl<T: IoVectoredBufMut, C: IoBufMut, S> PollFirst for RecvMsg<T, C, S> {
270 fn poll_first(&mut self) {
271 self.poll_first = true;
272 }
273}
274
275impl<T: IoVectoredBufMut, C: IoBufMut, S> IntoInner for RecvMsg<T, C, S> {
276 type Inner = ((T, C), Option<SockAddr>, usize, ReturnFlags);
277
278 fn into_inner(self) -> Self::Inner {
279 (
280 (self.buffer, self.control),
281 self.header.into_addr(),
282 self.control_len,
283 self.return_flags,
284 )
285 }
286}
287
288impl<T: IoBufMut, S> Recv<T, S> {
289 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
291 Self {
292 fd,
293 buffer,
294 flags,
295 poll_first: false,
296 }
297 }
298}
299
300impl<T: IoBufMut, S> PollFirst for Recv<T, S> {
301 fn poll_first(&mut self) {
302 self.poll_first = true;
303 }
304}
305
306impl<T: IoBufMut, S> IntoInner for Recv<T, S> {
307 type Inner = T;
308
309 fn into_inner(self) -> Self::Inner {
310 self.buffer
311 }
312}
313
314impl<T: IoVectoredBufMut, S> RecvVectored<T, S> {
315 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
317 Self {
318 fd,
319 buffer,
320 flags,
321 poll_first: false,
322 }
323 }
324}
325
326impl<T: IoVectoredBufMut, S> PollFirst for RecvVectored<T, S> {
327 fn poll_first(&mut self) {
328 self.poll_first = true;
329 }
330}
331
332impl<T: IoVectoredBufMut, S> IntoInner for RecvVectored<T, S> {
333 type Inner = T;
334
335 fn into_inner(self) -> Self::Inner {
336 self.buffer
337 }
338}
339
340impl<S> RecvFromHeader<S> {
341 pub fn new(fd: S, flags: RecvFlags) -> Self {
342 let addr = SockAddrStorage::zeroed();
343 let name_len = addr.size_of();
344 Self {
345 fd,
346 addr,
347 flags,
348 addr_len: name_len,
349 poll_first: false,
350 }
351 }
352
353 pub fn into_addr(self) -> Option<SockAddr> {
354 (self.addr_len > 0).then(|| unsafe { SockAddr::new(self.addr, self.addr_len) })
355 }
356}
357
358impl<T: IoVectoredBufMut, S> RecvFromVectored<T, S> {
359 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
361 Self {
362 header: RecvFromHeader::new(fd, flags),
363 buffer,
364 }
365 }
366}
367
368impl<T: IoVectoredBufMut, S> PollFirst for RecvFromVectored<T, S> {
369 fn poll_first(&mut self) {
370 self.header.poll_first = true;
371 }
372}
373
374impl<T: IoVectoredBufMut, S: AsFd> IntoInner for RecvFromVectored<T, S> {
375 type Inner = (T, Option<SockAddr>);
376
377 fn into_inner(self) -> Self::Inner {
378 let addr = self.header.into_addr();
379 (self.buffer, addr)
380 }
381}
382
383impl<T: IoBufMut, S> RecvFrom<T, S> {
384 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
386 Self {
387 header: RecvFromHeader::new(fd, flags),
388 buffer,
389 }
390 }
391}
392
393impl<T: IoBufMut, S> PollFirst for RecvFrom<T, S> {
394 fn poll_first(&mut self) {
395 self.header.poll_first = true;
396 }
397}
398
399impl<T: IoBufMut, S> IntoInner for RecvFrom<T, S> {
400 type Inner = (T, Option<SockAddr>);
401
402 fn into_inner(self) -> Self::Inner {
403 (self.buffer, self.header.into_addr())
404 }
405}